Ansible এ ট্যাগ (Tags) এবং হ্যান্ডলার (Handlers) হলো দুটি গুরুত্বপূর্ণ ফিচার যা প্লেবুক এবং রোলগুলোকে আরও কার্যকর এবং সুসংগঠিত করে তোলে। এগুলি ব্যবহার করে আপনি প্লেবুকের মধ্যে নির্দিষ্ট টাস্ক বা অ্যাকশন কন্ট্রোল করতে পারেন এবং টাস্কগুলোকে ডায়নামিকভাবে চালাতে পারেন।
ট্যাগ (Tags)
ট্যাগ হলো একটি উপায়, যার মাধ্যমে আপনি প্লেবুকের নির্দিষ্ট টাস্ক বা রোলগুলোকে চিহ্নিত করতে পারেন, এবং প্লেবুক রান করার সময় নির্দিষ্ট ট্যাগগুলির টাস্ক বা রোল চালাতে পারেন। এটি বিশেষ করে তখন কাজের যখন আপনি বড় প্লেবুকে নির্দিষ্ট অংশ চালাতে চান, পুরো প্লেবুক না চালিয়ে।
ট্যাগের সুবিধা
- নির্দিষ্ট টাস্ক বা রোল টার্গেট করা যায়।
- সময় বাঁচে, কারণ পুরো প্লেবুক না চালিয়ে নির্দিষ্ট অংশ চালানো যায়।
- ডিবাগিং এবং টেস্টিং সহজ হয়, কারণ আপনি নির্দিষ্ট অংশ টেস্ট করতে পারেন।
উদাহরণ: ট্যাগ ব্যবহার
---
- name: Install and configure web server
hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
tags:
- install
- nginx
- name: Configure Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
tags:
- config
- nginx
- name: Start Nginx service
service:
name: nginx
state: started
tags:
- start
- nginx
ট্যাগ ব্যবহার করে নির্দিষ্ট টাস্ক চালানো
উপরের প্লেবুকের ক্ষেত্রে, আপনি যদি শুধু install ট্যাগের টাস্ক চালাতে চান, তাহলে নিচের মত কমান্ড ব্যবহার করতে পারেন:
ansible-playbook playbook.yml --tags "install"
এটি শুধু সেই টাস্ক চালাবে, যেখানে install ট্যাগ আছে। আপনি একাধিক ট্যাগও দিতে পারেন:
ansible-playbook playbook.yml --tags "install,config"
টাস্ক স্কিপ করা ট্যাগ দিয়ে
যদি আপনি নির্দিষ্ট টাস্কগুলো বাদ দিতে চান, তাহলে --skip-tags ফ্ল্যাগ ব্যবহার করতে পারেন:
ansible-playbook playbook.yml --skip-tags "start"
এটি start ট্যাগযুক্ত টাস্কগুলো বাদ দিয়ে বাকি টাস্কগুলো চালাবে।
হ্যান্ডলার (Handlers)
হ্যান্ডলার হলো বিশেষ ধরনের টাস্ক যা সাধারণত সার্ভিস রিস্টার্ট, ফাইল রিলোড, বা কোনো অ্যাকশন ট্রিগার করতে ব্যবহৃত হয়, তবে এটি শুধুমাত্র তখনই চালানো হয় যখন কোনো নির্দিষ্ট টাস্ক সফলভাবে চালানো হয় এবং পরিবর্তন করে।
হ্যান্ডলারের বৈশিষ্ট্য
- নাম: হ্যান্ডলারের জন্য একটি নাম দিতে হয় যাতে টাস্ক থেকে
notifyকরে সেটিকে ট্রিগার করা যায়। - হ্যান্ডলারগুলো সাধারণত কনফিগারেশন ফাইল পরিবর্তনের পর সার্ভিস রিস্টার্ট বা রিলোড করার জন্য ব্যবহার করা হয়।
- হ্যান্ডলারগুলো প্লেবুকের শেষে একবার চালানো হয়, যদি তাদের ট্রিগার করার কোনো টাস্ক পরিবর্তন করে থাকে।
উদাহরণ: হ্যান্ডলার ব্যবহার
---
- name: Install and configure Nginx
hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
notify: Restart Nginx
- name: Copy Nginx configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Reload Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
- name: Reload Nginx
service:
name: nginx
state: reloaded
ব্যাখ্যা:
- notify: টাস্কগুলোতে
notifyব্যবহার করেRestart NginxএবংReload Nginxহ্যান্ডলারকে কল করা হয়েছে। - যদি টাস্কগুলোতে কোন পরিবর্তন ঘটে, তাহলে সংশ্লিষ্ট হ্যান্ডলারগুলো প্লেবুকের শেষে চালানো হবে।
হ্যান্ডলার ব্যবহার করে ত্রুটি নিয়ন্ত্রণ
হ্যান্ডলারগুলো ত্রুটি নিয়ন্ত্রণেও ব্যবহার করা যায়। যখন টাস্ক কোনো পরিবর্তন ঘটায় এবং সেই পরিবর্তনের ভিত্তিতে নির্দিষ্ট কিছু করতে হয়, তখন হ্যান্ডলার কার্যকর হয়।
সংক্ষেপে: ট্যাগ এবং হ্যান্ডলারের পার্থক্য
| বৈশিষ্ট্য | ট্যাগ (Tags) | হ্যান্ডলার (Handlers) |
|---|---|---|
| কার্যকারিতা | নির্দিষ্ট টাস্ক বা রোল চালাতে বা স্কিপ করতে | টাস্কের পরিবর্তনের উপর নির্ভর করে নির্দিষ্ট অ্যাকশন চালায় |
| কনফিগারেশন | tags: কিওয়ার্ড দিয়ে টাস্কে সংযোজন করা | টাস্ক থেকে notify দিয়ে ট্রিগার করা হয় |
| চালানোর সময় | প্লেবুক রান করার সময় নির্দিষ্ট ট্যাগ সিলেক্ট করে | প্লেবুকের শেষে, যদি কোন টাস্ক হ্যান্ডলারকে কল করে |
এইভাবে ট্যাগ এবং হ্যান্ডলার ব্যবহার করে Ansible প্লেবুককে আরও কাস্টমাইজড, কার্যকর, এবং নিয়ন্ত্রণযোগ্য করা যায়।
Ansible এ টাস্ক ট্যাগিং একটি পদ্ধতি, যা নির্দিষ্ট টাস্ক বা টাস্কগুলিকে নির্দিষ্ট ট্যাগ দিয়ে চিহ্নিত করে। ট্যাগ ব্যবহার করে আপনি প্লেবুকের নির্দিষ্ট টাস্ক বা অংশ রান করতে বা স্কিপ করতে পারেন। এটি বড় প্লেবুক বা জটিল ইনফ্রাস্ট্রাকচারের ক্ষেত্রে অত্যন্ত উপযোগী, কারণ আপনি শুধুমাত্র প্রয়োজনীয় অংশ বা টাস্কগুলিকে টার্গেট করতে পারেন, এবং বাকি অংশগুলি এড়িয়ে যেতে পারেন।
টাস্ক ট্যাগিং কীভাবে কাজ করে?
Ansible এ টাস্ক, রোল, এমনকি পুরো প্লেবুকেও ট্যাগ ব্যবহার করা যায়। যখন আপনি প্লেবুক রান করেন, তখন --tags অথবা --skip-tags ফ্ল্যাগ ব্যবহার করে নির্দিষ্ট টাস্ক বা অংশ নিয়ন্ত্রণ করতে পারেন।
টাস্ক ট্যাগিংয়ের উদাহরণ
---
- name: Example playbook with task tagging
hosts: all
become: yes
tasks:
- name: Install Apache
apt:
name: apache2
state: present
tags:
- webserver
- install
- name: Start Apache service
service:
name: apache2
state: started
tags:
- webserver
- start
- name: Install MySQL
apt:
name: mysql-server
state: present
tags:
- database
- install
- name: Start MySQL service
service:
name: mysql
state: started
tags:
- database
- start
এখানে, টাস্কগুলিকে বিভিন্ন ট্যাগ দিয়ে চিহ্নিত করা হয়েছে যেমন: webserver, install, database, এবং start। এই ট্যাগগুলো পরে প্লেবুক রান করার সময় নির্দিষ্ট টাস্কগুলো সিলেক্ট করতে বা এড়িয়ে যেতে সাহায্য করবে।
ট্যাগ ব্যবহার করে টাস্ক নিয়ন্ত্রণ করা
প্লেবুক রান করার সময় --tags অথবা --skip-tags ফ্ল্যাগ ব্যবহার করে নির্দিষ্ট টাস্ক বা অংশ নিয়ন্ত্রণ করা যায়।
১. নির্দিষ্ট ট্যাগের টাস্কগুলো রান করা
যদি আপনি শুধু webserver ট্যাগযুক্ত টাস্কগুলো রান করতে চান, তাহলে নিচের মতো কমান্ড ব্যবহার করতে পারেন:
ansible-playbook playbook.yml --tags "webserver"
এটি শুধুমাত্র webserver ট্যাগযুক্ত টাস্কগুলো রান করবে, অন্য টাস্কগুলো স্কিপ করবে।
২. একাধিক ট্যাগ দিয়ে টাস্ক রান করা
আপনি একাধিক ট্যাগ দিয়ে কমান্ড দিতে পারেন, সেক্ষেত্রে কমা (,) দিয়ে ট্যাগগুলো আলাদা করতে হবে:
ansible-playbook playbook.yml --tags "webserver,database"
এটি webserver এবং database ট্যাগযুক্ত সমস্ত টাস্ক রান করবে।
৩. ট্যাগ ব্যবহার করে টাস্ক স্কিপ করা
যদি আপনি একটি নির্দিষ্ট ট্যাগের টাস্কগুলো এড়িয়ে যেতে চান, তাহলে --skip-tags ব্যবহার করতে পারেন:
ansible-playbook playbook.yml --skip-tags "database"
এটি database ট্যাগযুক্ত টাস্কগুলো স্কিপ করবে এবং অন্য সব টাস্ক রান করবে।
ট্যাগিং ব্যবহার করার সুবিধা
- ফাইন-গ্রেইন কন্ট্রোল: ট্যাগ ব্যবহার করে আপনি প্লেবুকের নির্দিষ্ট অংশ বা টাস্কগুলো নিয়ন্ত্রণ করতে পারেন, যা বড় এবং জটিল প্লেবুকের ক্ষেত্রে খুব কার্যকর।
- দ্রুত ডিবাগিং: যদি কোনো নির্দিষ্ট টাস্কে সমস্যা থাকে, তাহলে আপনি শুধু সেই টাস্ক বা সম্পর্কিত টাস্কগুলো রান করতে পারেন, যা ডিবাগিং সহজ করে।
- টাস্ক স্কোপিং: কিছু নির্দিষ্ট কাজ বা সেটআপ বারবার রান করা দরকার হলে, ট্যাগ ব্যবহার করে আপনি শুধু সেই অংশ রান করতে পারেন, বাকি অংশ স্কিপ করতে পারেন।
- সহজ মেইনটেনেন্স: বড় প্লেবুকে যদি অনেক টাস্ক থাকে, ট্যাগ ব্যবহার করে আপনি সেটিকে ছোট ছোট অংশে ভাগ করতে পারেন এবং সেগুলো আলাদাভাবে রান করতে পারেন।
প্লেবুকের শুরুতে ট্যাগ ব্যবহার করা
আপনি চাইলে একটি পুরো রোল বা প্লেবুকেও ট্যাগ প্রয়োগ করতে পারেন, যাতে সেই ট্যাগ রান করার সময় পুরো রোল বা প্লেবুক কার্যকর হয়।
---
- name: Playbook with role tagging
hosts: all
roles:
- { role: apache, tags: ["webserver"] }
এখানে, apache রোলটি webserver ট্যাগ দিয়ে চিহ্নিত করা হয়েছে। আপনি --tags "webserver" ব্যবহার করলে এই রোলের সমস্ত টাস্ক কার্যকর হবে।
সংক্ষেপে
- টাস্ক ট্যাগিং: এটি টাস্কগুলিকে ট্যাগ দিয়ে চিহ্নিত করার পদ্ধতি, যাতে প্লেবুকের নির্দিষ্ট অংশ বা টাস্কগুলো নিয়ন্ত্রণ করা যায়।
- ট্যাগ ব্যবহার করে টাস্ক নিয়ন্ত্রণ:
--tagsএবং--skip-tagsফ্ল্যাগ ব্যবহার করে নির্দিষ্ট টাস্ক রান করা বা স্কিপ করা যায়, যা প্লেবুকের কার্যকারিতা এবং কর্মক্ষমতা বাড়ায়।
Ansible এ টাস্ক ট্যাগিং এবং ট্যাগ ব্যবহার করে প্লেবুককে আরও মডুলার, পুনরায় ব্যবহারযোগ্য, এবং মেইনটেইনেবল করা যায়, যা ইনফ্রাস্ট্রাকচারের জটিলতা হ্রাস করে।
হ্যান্ডলার হলো Ansible-এ একটি বিশেষ ধরনের টাস্ক যা নির্দিষ্ট শর্ত পূরণ হলে অথবা নির্দিষ্ট ইভেন্ট ঘটলে চালু হয়। সাধারণত হ্যান্ডলার ব্যবহার করা হয় কনফিগারেশন পরিবর্তনের পর বা কোনো টাস্ক সফলভাবে সম্পন্ন হওয়ার পর কিছু নির্দিষ্ট অ্যাকশন (যেমন: সার্ভিস রিস্টার্ট করা, ক্যাশ ক্লিয়ার করা) চালানোর জন্য।
হ্যান্ডলার কীভাবে কাজ করে?
- হ্যান্ডলারগুলো সাধারণ টাস্কের মতো কাজ করে, তবে এগুলো শুধুমাত্র তখনই চালু হয় যখন কোনো টাস্ক থেকে
notifyনির্দেশ দেওয়া হয়। - যদি কোনো টাস্ক হ্যান্ডলারকে
notifyকরে, তাহলে পুরো প্লেবুক চলার পর সেই হ্যান্ডলারটি একবার (একাধিকবার নয়) চালানো হবে। - হ্যান্ডলার সাধারণত
handlersসেকশনে সংরক্ষণ করা হয় এবং এটি একটি নির্দিষ্ট অ্যাকশন সম্পাদন করার জন্য তৈরি করা হয়।
হ্যান্ডলার ব্যবহারের কারণ
হ্যান্ডলার ব্যবহারের কয়েকটি মূল কারণ হলো:
- কনফিগারেশন পরিবর্তনের পর সার্ভিস রিস্টার্ট করা: যখন আপনি কোনো সার্ভিসের কনফিগারেশন পরিবর্তন করেন, তখন সেই সার্ভিসটি রিস্টার্ট করতে হয়। হ্যান্ডলার ব্যবহার করে আপনি কনফিগারেশন টাস্কটি সফল হলে সার্ভিস রিস্টার্ট করতে পারেন।
- অপটিমাইজড এক্সিকিউশন: একটি প্লেবুকে একাধিক টাস্ক একই হ্যান্ডলারকে
notifyকরতে পারে, কিন্তু এটি একবারই চালু হবে। এটি অপটিমাইজড এক্সিকিউশন নিশ্চিত করে। - নির্দিষ্ট ইভেন্টের প্রতিক্রিয়া: নির্দিষ্ট শর্ত বা ইভেন্ট ঘটলে (যেমন একটি ফাইল পরিবর্তন হলে) হ্যান্ডলার ব্যবহার করে অ্যাকশন নেওয়া যায়।
উদাহরণ
ধরা যাক, একটি প্লেবুকে Nginx কনফিগারেশন আপডেট করা হচ্ছে, এবং কনফিগারেশন পরিবর্তনের পর Nginx রিস্টার্ট করতে হবে। নিচে একটি উদাহরণ প্লেবুক দেয়া হলো:
---
- name: Configure Nginx
hosts: webservers
become: yes
tasks:
- name: Deploy Nginx configuration
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
বিশ্লেষণ:
tasksসেকশনে একটি টাস্ক আছে যাtemplateমডিউল ব্যবহার করে Nginx কনফিগারেশন ফাইল আপডেট করছে।notify: Restart Nginxনির্দেশটি ব্যবহার করে টাস্কটি হ্যান্ডলারকে জানাচ্ছে যে যদি এই টাস্ক সফল হয়, তাহলে হ্যান্ডলার চালানো হবে।handlersসেকশনেRestart Nginxনামের একটি হ্যান্ডলার আছে, যা Nginx সার্ভিসটি রিস্টার্ট করবে।
হ্যান্ডলার কখন ব্যবহার করবেন?
- সার্ভিস রিস্টার্ট বা রিলোড করা: কনফিগারেশন পরিবর্তন বা ফাইল আপডেট করার পর সার্ভিস রিস্টার্ট বা রিলোড করার জন্য।
- ক্যাশ ক্লিয়ার করা: অ্যাপ্লিকেশনের ক্যাশ ক্লিয়ার করতে বা ডাটা রিফ্রেশ করতে।
- সিস্টেম রিসেট বা রিপ্রভিশন করা: সিস্টেমে বড় ধরনের পরিবর্তনের পর নির্দিষ্ট অ্যাকশন চালাতে।
হ্যান্ডলার ব্যবহার করার সুবিধা
- পুনরাবৃত্তি কমানো: একটি টাস্ক একাধিকবার হ্যান্ডলারকে
notifyকরলেও, হ্যান্ডলারটি শুধুমাত্র একবারই চালু হবে। - প্লেবুকের কার্যকারিতা বাড়ানো: নির্দিষ্ট টাস্ক সম্পন্ন হওয়ার পরে এবং প্রয়োজনমতো অ্যাকশন নেওয়ার মাধ্যমে প্লেবুক আরও কার্যকরী হয়।
- কোডের পুনঃব্যবহারযোগ্যতা: হ্যান্ডলারগুলোকে আলাদা করে সংরক্ষণ করে পরবর্তীতে সহজে ব্যবহার করা যায়।
সারসংক্ষেপ
- হ্যান্ডলার: Ansible-এর বিশেষ টাস্ক যা নির্দিষ্ট টাস্ক থেকে
notifyপেলে প্লেবুক শেষে একবার চালু হয়। - ব্যবহার ক্ষেত্র: সার্ভিস রিস্টার্ট, ক্যাশ ক্লিয়ার, সিস্টেম রিসেট ইত্যাদি।
- সুবিধা: অপটিমাইজড এক্সিকিউশন, পুনরাবৃত্তি কমানো, প্লেবুকের কার্যকারিতা বাড়ানো।
হ্যান্ডলার ব্যবহারের মাধ্যমে Ansible প্লেবুককে আরও কার্যকর এবং সংক্ষিপ্ত করা যায়, যা পরিচালনাকে সহজ এবং আরও কার্যকর করে তোলে।
Ansible-এ notify এবং হ্যান্ডলার একসঙ্গে কাজ করে একটি নির্দিষ্ট ইভেন্ট ঘটলে বা কোনো টাস্ক সফলভাবে সম্পন্ন হলে নির্দিষ্ট অ্যাকশন চালু করার জন্য। notify একটি নির্দেশনা যা টাস্কের সাথে সংযুক্ত থাকে, এবং এটি হ্যান্ডলারকে ট্রিগার করার জন্য ব্যবহার করা হয়। অন্যদিকে, হ্যান্ডলার হলো সেই টাস্ক যা notify নির্দেশনার মাধ্যমে চালু হয়।
notify এবং হ্যান্ডলারের মধ্যে সম্পর্ক কীভাবে কাজ করে?
- যখন কোনো টাস্কে
notifyব্যবহার করা হয়, তখন সেই টাস্ক সফলভাবে সম্পন্ন হলে Ansible সেই নির্দিষ্ট হ্যান্ডলারকে "ট্রিগার" করে। - প্লেবুক চলাকালীন সময়ে, যতবারই টাস্ক
notifyকরে, Ansible সেই হ্যান্ডলারকে শুধুমাত্র একবার চালাবে। - হ্যান্ডলারগুলো সাধারণত প্লেবুকের শেষে বা পুরো হোস্টের জন্য চলার পরে চালু হয়।
notify এবং হ্যান্ডলারের সম্পর্ক
notify:
- এটি একটি নির্দেশনা যা টাস্কের সাথে সংযুক্ত থাকে এবং একটি নির্দিষ্ট হ্যান্ডলারের নাম উল্লেখ করে।
- যদি টাস্কটি সফল হয়, তাহলে হ্যান্ডলারকে "নোটিফাই" করা হয় অর্থাৎ সেটিকে পরে চালু করার জন্য "পেন্ডিং" রাখা হয়।
হ্যান্ডলার:
- হ্যান্ডলার হলো একটি বিশেষ টাস্ক যা তখনই চালু হয় যখন কোনো টাস্ক
notifyকরে। - একটি প্লেবুকে হ্যান্ডলারগুলো সাধারণত
handlersসেকশনে সংরক্ষণ করা হয়।
উদাহরণ
নিচে একটি উদাহরণ প্লেবুক দেয়া হলো যেখানে notify এবং হ্যান্ডলারের মধ্যে সম্পর্ক দেখানো হয়েছে:
---
- name: Configure Nginx
hosts: webservers
become: yes
tasks:
- name: Deploy Nginx configuration
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: Restart Nginx
handlers:
- name: Restart Nginx
service:
name: nginx
state: restarted
উদাহরণটি বিশ্লেষণ:
tasks সেকশনে:
Deploy Nginx configurationটাস্কটি Nginx কনফিগারেশন ফাইল আপডেট করছে।- এই টাস্কটি সফল হলে, এটি
notify: Restart Nginxনির্দেশনা দেয়, অর্থাৎRestart Nginxনামের হ্যান্ডলারকে ট্রিগার করে।
handlers সেকশনে:
Restart Nginxনামে একটি হ্যান্ডলার আছে, যা Nginx সার্ভিস রিস্টার্ট করবে।- যদি কোনো টাস্ক এই হ্যান্ডলারকে
notifyকরে, তাহলে প্লেবুকের শেষে এই হ্যান্ডলারটি একবার চালু হবে।
notify এবং হ্যান্ডলার ব্যবহারের সুবিধা
অপটিমাইজড এক্সিকিউশন:
- একটি প্লেবুকে একাধিক টাস্ক একই হ্যান্ডলারকে
notifyকরতে পারে, তবে এটি শুধুমাত্র একবার চালু হয়। উদাহরণস্বরূপ, যদি একটি কনফিগারেশন ফাইল পরিবর্তন হয় এবং একাধিক টাস্ক হ্যান্ডলারকেnotifyকরে, তবে হ্যান্ডলারটি শুধুমাত্র একবার চালু হবে।
ডিপেন্ডেন্ট অ্যাকশন:
notifyএবং হ্যান্ডলার ব্যবহার করে নির্দিষ্ট শর্ত পূরণ হলে বা কনফিগারেশন পরিবর্তনের পর স্বয়ংক্রিয়ভাবে অ্যাকশন (যেমন: সার্ভিস রিস্টার্ট) নেওয়া যায়।
কোড পুনঃব্যবহারযোগ্যতা:
- হ্যান্ডলার আলাদাভাবে সংরক্ষণ করা হলে, এটি পুনরায় ব্যবহার করা যায়। যেকোনো টাস্ক
notifyদিয়ে একই হ্যান্ডলারকে ট্রিগার করতে পারে।
সারসংক্ষেপ
notify: এটি একটি নির্দেশনা যা একটি টাস্কে ব্যবহৃত হয় এবং হ্যান্ডলারকে ট্রিগার করে, যদি সেই টাস্কটি সফল হয়।- হ্যান্ডলার: এটি একটি টাস্ক যা
notifyএর মাধ্যমে ট্রিগার হয় এবং প্লেবুকের শেষে একবার চালু হয়। - সম্পর্ক:
notifyহ্যান্ডলারকে ট্রিগার করে এবং কেবলমাত্র সেই অবস্থায় হ্যান্ডলারটি চালু হয় যখন একটি টাস্ক সফলভাবে সম্পন্ন হয় এবং হ্যান্ডলারকেnotifyকরে।
এইভাবে, Ansible-এ notify এবং হ্যান্ডলারের মধ্যে একটি কার্যকর এবং সামঞ্জস্যপূর্ণ সম্পর্ক রয়েছে, যা প্লেবুকগুলিকে আরও কার্যকরী এবং সুসংগঠিত করতে সহায়ক।
Read more